package com.accelstack.cmp.security;

import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;

import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
import java.util.concurrent.TimeUnit;

/**
 * Token管理器
 * 基于Redis的简单Token管理
 */
@Slf4j
@Component
@RequiredArgsConstructor
public class TokenManager {
    
    private final RedisTemplate<String, Object> redisTemplate;
    
    @Value("${app.token.expiration:86400}")
    private long tokenExpiration;
    
    private static final String TOKEN_PREFIX = "token:";
    
    /**
     * 生成Token
     * @param username 用户名
     * @param accessKey 访问密钥
     * @return Token字符串
     */
    public String generateToken(String username, String accessKey) {
        // 生成随机Token
        String token = UUID.randomUUID().toString().replace("-", "") + 
                      UUID.randomUUID().toString().replace("-", "");
        
        // 存储Token信息到Redis
        Map<String, Object> tokenInfo = new HashMap<>();
        tokenInfo.put("username", username);
        tokenInfo.put("accessKey", accessKey);
        tokenInfo.put("createTime", System.currentTimeMillis());
        
        String key = TOKEN_PREFIX + token;
        redisTemplate.opsForHash().putAll(key, tokenInfo);
        redisTemplate.expire(key, tokenExpiration, TimeUnit.SECONDS);
        
        log.debug("Token已生成 - 用户: {}, 有效期: {}秒", username, tokenExpiration);
        
        return token;
    }
    
    /**
     * 验证Token是否有效
     */
    public boolean validateToken(String token) {
        if (token == null || token.isEmpty()) {
            return false;
        }
        
        String key = TOKEN_PREFIX + token;
        return Boolean.TRUE.equals(redisTemplate.hasKey(key));
    }
    
    /**
     * 从Token获取用户名
     */
    public String getUsernameFromToken(String token) {
        String key = TOKEN_PREFIX + token;
        Object username = redisTemplate.opsForHash().get(key, "username");
        return username != null ? username.toString() : null;
    }
    
    /**
     * 从Token获取AccessKey
     */
    public String getAccessKeyFromToken(String token) {
        String key = TOKEN_PREFIX + token;
        Object accessKey = redisTemplate.opsForHash().get(key, "accessKey");
        return accessKey != null ? accessKey.toString() : null;
    }
    
    /**
     * 获取Token信息
     */
    public Map<Object, Object> getTokenInfo(String token) {
        String key = TOKEN_PREFIX + token;
        return redisTemplate.opsForHash().entries(key);
    }
    
    /**
     * 刷新Token（延长有效期）
     */
    public boolean refreshToken(String token) {
        String key = TOKEN_PREFIX + token;
        if (Boolean.TRUE.equals(redisTemplate.hasKey(key))) {
            redisTemplate.expire(key, tokenExpiration, TimeUnit.SECONDS);
            log.debug("Token已刷新 - Token: {}", token.substring(0, 8) + "...");
            return true;
        }
        return false;
    }
    
    /**
     * 删除Token（登出）
     */
    public void deleteToken(String token) {
        String key = TOKEN_PREFIX + token;
        String username = getUsernameFromToken(token);
        redisTemplate.delete(key);
        log.info("Token已删除 - 用户: {}", username);
    }
    
    /**
     * 获取Token剩余有效时间（秒）
     */
    public Long getTokenTTL(String token) {
        String key = TOKEN_PREFIX + token;
        return redisTemplate.getExpire(key, TimeUnit.SECONDS);
    }
    
    /**
     * 删除用户的所有Token
     */
    public void deleteAllUserTokens(String username) {
        // 注意：这需要遍历所有token，性能较低，建议使用用户维度的token集合
        log.info("删除用户所有Token - 用户: {}", username);
    }
}

